{
    "cells": [
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "RHNxZTMC8Ute"
            },
            "source": [
                "<center>\n",
                "    <p style=\"text-align:center\">\n",
                "        <img alt=\"phoenix logo\" src=\"https://storage.googleapis.com/arize-phoenix-assets/assets/phoenix-logo-light.svg\" width=\"200\"/>\n",
                "        <br>\n",
                "        <a href=\"https://docs.arize.com/phoenix/\">Docs</a>\n",
                "        |\n",
                "        <a href=\"https://github.com/Arize-ai/phoenix\">GitHub</a>\n",
                "        |\n",
                "        <a href=\"https://join.slack.com/t/arize-ai/shared_invite/zt-1px8dcmlf-fmThhDFD_V_48oU7ALan4Q\">Community</a>\n",
                "    </p>\n",
                "</center>\n",
                "<h1 align=\"center\">Reference Link Evals</h1>\n",
                "\n",
                "The purpose of this notebook is:\n",
                "\n",
                "- to evaluate the performance of an LLM-assisted approach to detecting the quality of Reference links provided in Q&A answers,\n",
                "- to provide an experimental framework for users to iterate and improve on the default classification template.\n",
                "\n"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "Ezc_IY2Y73WA"
            },
            "source": [
                "# Reference Links in Q&A\n",
                "\n",
                "In only chatbots and Q&A systems, many times reference links are provided to along with an answer to help point users to documentation or pages that contain more information or the source for the answer.\n",
                "\n",
                "EXAMPLE:\n",
                "Q&A from Arize-Phoenix Documentation\n",
                "\n",
                "**QUESTION**:\n",
                "Does Phoenix Evals support models besides OpenAI for running Evals?\n",
                "\n",
                "**ANSWER**:\n",
                "Phoenix does support a large set of LLM models through the model object. Phoenix supports OpenAI (GPT-4, GPT-4-32k, GPT-3.5 Turbo, GPT-3.5 Instruct, etc...), Azure OpenAI, Google Palm2 Text Bison, and All AWS Bedrock models (Claude, Mistral, etc...).\n",
                "\n",
                "**REFERENCE LINK**:\n",
                "https://docs.arize.com/phoenix/api/evaluation-models\n",
                "\n",
                "This Eval checks the reference link returned answers the question asked in a coversation\n"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 1,
            "metadata": {
                "id": "AARrd9pE8Uth"
            },
            "outputs": [],
            "source": [
                "#####################\n",
                "## N_EVAL_SAMPLE_SIZE\n",
                "#####################\n",
                "# Eval sample size determines the run time\n",
                "# 100 samples: GPT-4 ~ 80 sec / GPT-3.5 ~ 40 sec\n",
                "# 1,000 samples: GPT-4 ~15-17 min / GPT-3.5 ~ 6-7min (depending on retries)\n",
                "# 10,000 samples GPT-4 ~170 min / GPT-3.5 ~ 70min\n",
                "N_EVAL_SAMPLE_SIZE = 180\n",
                "\n",
                "# If you want to provide URLs and have this notebook download the page text\n",
                "# The default test dataset already has the downloaded text data\n",
                "DOWNLOAD_TEXT_FROM_URL = False"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "TKdtWJOX72lw"
            },
            "source": [
                "## Install Dependencies and Import Libraries"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 2,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/"
                },
                "id": "YbD9W-AJ8Uti",
                "outputId": "08b263ae-5035-4f68-9dad-65f499eddaa6"
            },
            "outputs": [],
            "source": [
                "!pip install -qq \"arize-phoenix[llama-index]\" \"arize-phoenix-evals>=0.0.5\" ipython matplotlib \"openai>1\" pycm scikit-learn tiktoken playwright nest_asyncio"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "ℹ️ To enable async request submission in notebook environments like Jupyter or Google Colab, optionally use `nest_asyncio`. `nest_asyncio` globally patches `asyncio` to enable event loops to be re-entrant. This is not required for non-notebook environments.\n",
                "\n",
                "Without `nest_asyncio`, eval submission can be much slower, depending on your organization's rate limits. Speed increases of about 5x are typical."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 3,
            "metadata": {},
            "outputs": [],
            "source": [
                "import nest_asyncio\n",
                "\n",
                "nest_asyncio.apply()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 4,
            "metadata": {
                "id": "dTi-Neb78Utj"
            },
            "outputs": [],
            "source": [
                "import os\n",
                "from getpass import getpass\n",
                "\n",
                "import matplotlib.pyplot as plt\n",
                "import openai\n",
                "import pandas as pd\n",
                "import phoenix as px\n",
                "from phoenix.evals import (\n",
                "    REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP,\n",
                "    REFERENCE_LINK_CORRECTNESS_PROMPT_TEMPLATE,\n",
                "    OpenAIModel,\n",
                "    llm_classify,\n",
                ")\n",
                "from phoenix.trace.openai import OpenAIInstrumentor\n",
                "from pycm import ConfusionMatrix\n",
                "from sklearn.metrics import classification_report\n",
                "\n",
                "pd.set_option(\"display.max_colwidth\", None)"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 5,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 91
                },
                "id": "zgy9PJ6-J4Iy",
                "outputId": "3477f1f6-3f82-4395-c807-983a1330deb5"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "🌍 To view the Phoenix app in your browser, visit http://localhost:6006/\n",
                        "📺 To view the Phoenix app in a notebook, run `px.active_session().view()`\n",
                        "📖 For more information on how to use Phoenix, check out https://docs.arize.com/phoenix\n"
                    ]
                }
            ],
            "source": [
                "px.launch_app()\n",
                "OpenAIInstrumentor().instrument()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "LaaxYq3pxQQL"
            },
            "source": [
                "![Screenshot 2023-11-13 at 11.37.49 PM.png]()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "bxliYFwXxYg5"
            },
            "source": [
                "Visualize your evals using Phoenix, click link above to open local phoenix session"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "zHgOWxXU8Utj"
            },
            "source": [
                "## Download Benchmark Dataset\n",
                "\n",
                "We'll evaluate the evaluation system consisting of an LLM model and settings in addition to an evaluation prompt template against benchmark datasets of queries and ground truth. This dataset was created based on questions and answers on the Arize documentation. There are answers with correct reference links and others with wrong reference links.\n"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 6,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 1000
                },
                "id": "Kqnxo2aO8Utj",
                "outputId": "2c41138c-9c92-44fc-d405-6cfba71db04d"
            },
            "outputs": [
                {
                    "data": {
                        "text/html": [
                            "<div>\n",
                            "<style scoped>\n",
                            "    .dataframe tbody tr th:only-of-type {\n",
                            "        vertical-align: middle;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe tbody tr th {\n",
                            "        vertical-align: top;\n",
                            "    }\n",
                            "\n",
                            "    .dataframe thead th {\n",
                            "        text-align: right;\n",
                            "    }\n",
                            "</style>\n",
                            "<table border=\"1\" class=\"dataframe\">\n",
                            "  <thead>\n",
                            "    <tr style=\"text-align: right;\">\n",
                            "      <th></th>\n",
                            "      <th>Unnamed: 0</th>\n",
                            "      <th>input</th>\n",
                            "      <th>url</th>\n",
                            "      <th>reference</th>\n",
                            "      <th>is_correct_ref_link</th>\n",
                            "    </tr>\n",
                            "  </thead>\n",
                            "  <tbody>\n",
                            "    <tr>\n",
                            "      <th>153</th>\n",
                            "      <td>193</td>\n",
                            "      <td>How do I load private images into Arize?</td>\n",
                            "      <td>https://docs.arize.com/arize/on-premise-deployment/on-premise/installation</td>\n",
                            "      <td>\\n\\n\\n\\n\\n\\nInstallation - Arize Docs\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCommunity SlackAsk or search…⌃KLinksArize AIWhat is ML Observability?What is LLM Observability?QuickstartAll Tutorials/Notebooks🪄Sending Data GuidesWhat Is A Model SchemaHow To Send Delayed ActualsFAQ &amp; Troubleshoot Data UploadTable Ingestion Tuning🔌Sending Data MethodsPython Pandas SDKUI Drag &amp; DropGoogle Cloud Storage (GCS)AWS S3Azure Blob StorageGoogle BigQueryDatabricksSnowflake🔢Model TypesLarge Language Models (LLM)Binary ClassificationMulti-Class ClassificationRegressionTimeseries ForecastingRankingNatural Language Processing (NLP)Image ClassificationObject Detection🔔MonitorsGet Started With MonitorsPerformance MonitorsDrift MonitorsData Quality MonitorsNotifications &amp; Integrations🔎TracingPerformance TracingDrift TracingData Quality Troubleshooting🖌EmbeddingsGenerate EmbeddingsEmbedding DriftEmbedding &amp; Cluster AnalyzerEmbeddings for Tabular Data (Multivariate Drift)Embeddings FAQ🦙LLM (Large Language Models)LLM EvaluationsPrompt EngineeringTroubleshoot Retrieval with Vector StoresOpen AI Cluster SummarizationCapturing User FeedbackIntegrations💡Active Learning and Fine TuningAutomate Model RetrainingExport Data to Notebook🎨dashboardsCreate A Dashboard🧙♂Explainability &amp; FairnessModel ExplainabilityBias Tracing (Fairness)🧩API ReferencePython SDKJava SDKR SDKRest APICustom Metrics Query LanguageGraphQL APIData API🏡On-Premise DeploymentOverviewRequirementsInstallation🔑Admin &amp; SettingsSSO &amp; RBAC (Role Based Access Control)Whitelisting📚ResourcesProduct FAQGlossaryML PlatformsCommon Industry Use Casesarize.comProduct Release NotesPhoenix OSSPowered By GitBookInstallationInstallation Details for Arize On-Prem DeploymentOverviewThe installation requires a release's TAR file that will be supplied by the Arize team. The TAR file includes all the documentation, terraforms, and Helm charts to install the Arize platform.Example content:arize-distribution-&lt;hash&gt;.tar|-examples|-terraform|-docs |-install-arize-using-helm.md |...arize.sharize-operator-chart.tgzarize-cr-chart.tgzRead the install-arize-using-helm.md documentation for more detailed instructions on how to install on GCP, AWS, or Azure.1. Pre-Deployment The Arize team can help size the cluster based on customer requirements. Storage bucket entities need to be created for Arize A service account or IAM roles need to be created with access to the bucket storage and Kubernetes clusterIP address and VPC setup should be discussed with the Arize team. Our team can help pre-configure the files for network setup based on required deployment options.There are three options available for loading Arize container images:(default) Let the cluster pull images from the Arize Central Registry ch.hub.arize.comTransfer images from the Arize Central Registry to a private registryDownload the images to a local folder and then upload the images into a private registry2. DeploymentTo get started quickly, you can use the scripts provided with the distribution. Extract the TAR file provided by the Arize team:tar -zxvf arize-distribution-&lt;hash&gt;.tararize.sh is the main installation script. This uses kubectl and helm to install the Arize Operator onto your cluster. The Operator then deploys the application and initializes the database and various components. arize.sh command​NAME     arize.sh – Arize AI's On-Prem Deployment Utility Script​SYNOPSIS     ./arize.sh [OPTIONS] &lt;OPERATION&gt; &lt;PARAMS&gt;​DESCRIPTION​      Script for managing the Arize platform. The script will look for a 'values.yaml' file in the same      folder or a file name provided with the -f option. If not file is found the script will use default      values or values passed in as arguments in the form 'cloud=gcp,etc'.​OPERATIONS​      download-charts       Download the helm charts for the corresponding release install               Install the Arize Operator and CR charts from values.yaml​      install-air-gapped    Install in a air-gapped environment when Operator can not contact Arize hub      pull-images           Pull images from the Arize central registry to the local docker      push-images           Push images from the local docker to the remote registry      save-images           Save images from docker to a local images folder      load-remote-images    Combines the Pull and Push steps      load-images           Load images from a local images folder into docker ...​EXAMPLE COMMON INSTALL​      ./arize.sh install​EXAMPLE AIR-GAPPED​      ./arize.sh load-remote-images      ./arize.sh install ...The arize.sh script calls helm which takes settings from a values.yaml file. This file includes parameters such as:1.cloud: gcp/aws/azure2.clusterName: The cluster name on kubeconfig of the deployment 3.gazetteBucket: The bucket name to hold gazette events4.druidBucket: The storage bucket to hold ui data5.postgresPassword: The postgres db admin password6.organizationName: The name of the organization owning the deployment7.clusterSizing: The size of the deployment (small, medium, large, etc)8.smtpPassword: The password for the SMTP service9.smtpUser: The user for the SMTP service10.smtpHost: The host endpoint for the SMTP service11.smtpSenderEmail: The smtp authenticated address emails should come from. e.g. From: [email protected]12.gcpProject: (GCP only)The name of the project in GCP.13.gcpServiceAccountName: (GCP only)The name of the service account14.gcpServiceAccountJsonKey: (GCP only) A key from the service account15.azurePrincipalId: (Azure only) The id of the Azure principal16.region: (AWS only) Cluster region17.serverSideEncryption: (AWS only) Optional encryption settings (Example: KMS)18.sseKmsKeyId: (AWS only) Optional KMS encryption keyRunning the script deploys the Arize Operator which then executes a number of steps that include:Applying the secretsApplying the manifests Preparing the DatabaseStarting the consumer applications Finally starting the User Interface and SDK receiverOutput of the script will look as follows:    ----------------------------------------------------------------------------------------------                    Welcome to Arize AI's On-Prem Utility Script    ----------------------------------------------------------------------------------------------    Using:      ...​    ▶ Running pre-checks...    ▶ Helm install Arize Operator...    ...    ▶ Helm install Arize CR...    ...    ▶ Waiting for Operator pod to be running...    ▶ Waiting for Operator to complete: Executing    ▶ Waiting for Operator to complete: Running    ▶ Waiting for postgres job to complete...    ▶ Waiting for pods to be running...    ▶ Waiting for pods to be running...    ----------------------------------------------------------------------------------------------                                Installation Completed    ----------------------------------------------------------------------------------------------    ✅ Receivers available at http://localhost:50050    ✅ Application available at http://localhost:4040    ✅ Metrics available at http://localhost:3000    ✅ Alerts available at http://localhost:9090    ✅ Druid available at http://localhost:8888    ✅ Alert Manager available at http://localhost:9093After installation, endpoints for sending data from the SDK and for accessing the Platform UI are available for consumption by other applications running in the cluster.  These endpoints can be exposed to infrastructure outside of kubernetes through additional Ingress configuration.Initial login is based on the default login and password in the configuration setup.3. Post DeployAfter deployment, teams should confirm:Secrets have been appliedAll Arize Kubernetes services are green and upTest that the User Interface is live by accessing it at localhost:4040:The Arize team will typically work on completing the installation through help in setting up IP addresses, initial login accounts and testing the end to end system.Questions? Email us at [email protected] or Slack us in the #arize-support channelPreviousRequirementsNext - Admin &amp; SettingsSSO &amp; RBAC (Role Based Access Control)Last modified 7mo agoOn this pageOverview1. Pre-Deployment 2. Deployment3. Post DeploySupportResourcesGet Started Chat Us On SlackBlogSignup For Free[email protected]CourseBook A DemoSupportChat Us On Slack[email protected]ResourcesBlogCourseGet Started Signup For FreeBook A DemoCopyright © 2023 Arize AI, Inc\\n\\n\\n\\n\\n</td>\n",
                            "      <td>True</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>104</th>\n",
                            "      <td>132</td>\n",
                            "      <td>Can I log single events?</td>\n",
                            "      <td>https://docs.arize.com/arize/api-reference/python-sdk</td>\n",
                            "      <td>\\n\\n\\n\\n\\n\\nPython SDK - Arize Docs\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCommunity SlackAsk or search…⌃KLinksArize AIWhat is ML Observability?What is LLM Observability?QuickstartAll Tutorials/Notebooks🪄Sending Data GuidesWhat Is A Model SchemaHow To Send Delayed ActualsFAQ &amp; Troubleshoot Data UploadTable Ingestion Tuning🔌Sending Data MethodsPython Pandas SDKUI Drag &amp; DropGoogle Cloud Storage (GCS)AWS S3Azure Blob StorageGoogle BigQueryDatabricksSnowflake🔢Model TypesLarge Language Models (LLM)Binary ClassificationMulti-Class ClassificationRegressionTimeseries ForecastingRankingNatural Language Processing (NLP)Image ClassificationObject Detection🔔MonitorsGet Started With MonitorsPerformance MonitorsDrift MonitorsData Quality MonitorsNotifications &amp; Integrations🔎TracingPerformance TracingDrift TracingData Quality Troubleshooting🖌EmbeddingsGenerate EmbeddingsEmbedding DriftEmbedding &amp; Cluster AnalyzerEmbeddings for Tabular Data (Multivariate Drift)Embeddings FAQ🦙LLM (Large Language Models)LLM EvaluationsPrompt EngineeringTroubleshoot Retrieval with Vector StoresOpen AI Cluster SummarizationCapturing User FeedbackIntegrations💡Active Learning and Fine TuningAutomate Model RetrainingExport Data to Notebook🎨dashboardsCreate A Dashboard🧙♂Explainability &amp; FairnessModel ExplainabilityBias Tracing (Fairness)🧩API ReferencePython SDKPandas Batch LoggingSingle Record LoggingChangelogJava SDKR SDKRest APICustom Metrics Query LanguageGraphQL APIData API🏡On-Premise DeploymentOverview🔑Admin &amp; SettingsSSO &amp; RBAC (Role Based Access Control)Whitelisting📚ResourcesProduct FAQGlossaryML PlatformsCommon Industry Use Casesarize.comProduct Release NotesPhoenix OSSPowered By GitBookPython SDKArize AI for Model Monitoring, Troubleshooting, and Explainability​  ​Use the Arize Python package to monitor machine learning predictions to observe your ML models and their features, predicted labels, and actual labels with just a few lines of code.Installing the packagepip install arizeIn addition to the basic functionality installed by the command above, the Arize SDK has additional functionality that can be installed with some extra dependencies:Auto Embeddings​ minimum required for Auto EmbeddingsWith this extra module, Arize extracts the embeddings in the appropriate way depending on your use case, and we return it to you to include in your Pandas DataFrame. Learn more here. To install the Arize package including this functionality:pip install arize[AutoEmbeddings]LLM Evaluation​ minimum required for LLM EvaluationWith this extra module, Arize helps you calculate evaluation metrics for your LLM Generative tasks. Learn more here. To install the Arize package including this functionality:pip install arize[LLM_Evaluation]Mimic Explainer​ minimum required for Mimic ExplainerWith this extra module, Arize gives the user the option to pass a flag with their request to send data that would produce SHAP values using the surrogate explainability approach. Learn more here. To install the Arize package including this functionality:pip install arize[MimicExplainer]Logging OptionsThe Arize Python SDK offers 2 ways of logging data into the platform:Pandas Batch LoggingDesigned for logging a batch of your model inferences using Pandas DataFrames. Go to the following page for more information.Pandas Batch LoggingSingle Record LoggingDesigned for low latency, one-at-a-time, logging of your model inferences. Go to the following page for more information.Single Record LoggingEnd of Support TableMajor ReleaseFirst ReleasedLatestSupport7.xJune, 2023​latest​Ends January 1st, 20266.xJanuary, 20236.1.3Ends January 1st, 20255.xAugust, 20225.5.0Ends October 1st, 20244.xMarch, 20224.2.2Ends June 1st, 20243.xSeptember, 20213.4.0Ends April 1st, 20242.xMarch, 20212.2.1Ended July 1st, 20231.xJuly, 20201.2.1Ended March 1st, 20220.xMarch, 20200.0.20Ended March 1st, 2022Explainability &amp; Fairness - PreviousBias Tracing (Fairness)NextPandas Batch LoggingLast modified 29d agoOn this pageInstalling the packageLogging OptionsEnd of Support TableSupportResourcesGet Started Chat Us On SlackBlogSignup For Free[email protected]CourseBook A DemoSupportChat Us On Slack[email protected]ResourcesBlogCourseGet Started Signup For FreeBook A DemoCopyright © 2023 Arize AI, Inc\\n\\n\\n\\n\\n</td>\n",
                            "      <td>True</td>\n",
                            "    </tr>\n",
                            "    <tr>\n",
                            "      <th>172</th>\n",
                            "      <td>216</td>\n",
                            "      <td>What format should the prediction timestamp be?</td>\n",
                            "      <td>https://docs.arize.com/arize/explainability-and-fairness/explainability/shap</td>\n",
                            "      <td>\\n\\n\\n\\n\\n\\nSHAP - Arize Docs\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCommunity SlackAsk or search…⌃KLinksArize AIWhat is ML Observability?What is LLM Observability?QuickstartAll Tutorials/Notebooks🪄Sending Data GuidesWhat Is A Model SchemaHow To Send Delayed ActualsFAQ &amp; Troubleshoot Data UploadTable Ingestion Tuning🔌Sending Data MethodsPython Pandas SDKUI Drag &amp; DropGoogle Cloud Storage (GCS)AWS S3Azure Blob StorageGoogle BigQueryDatabricksSnowflake🔢Model TypesLarge Language Models (LLM)Binary ClassificationMulti-Class ClassificationRegressionTimeseries ForecastingRankingNatural Language Processing (NLP)Image ClassificationObject Detection🔔MonitorsGet Started With MonitorsPerformance MonitorsDrift MonitorsData Quality MonitorsNotifications &amp; Integrations🔎TracingPerformance TracingDrift TracingData Quality Troubleshooting🖌EmbeddingsGenerate EmbeddingsEmbedding DriftEmbedding &amp; Cluster AnalyzerEmbeddings for Tabular Data (Multivariate Drift)Embeddings FAQ🦙LLM (Large Language Models)LLM EvaluationsPrompt EngineeringTroubleshoot Retrieval with Vector StoresOpen AI Cluster SummarizationCapturing User FeedbackIntegrations💡Active Learning and Fine TuningAutomate Model RetrainingExport Data to Notebook🎨dashboardsCreate A Dashboard🧙♂Explainability &amp; FairnessModel ExplainabilitySHAPSurrogate ModelBias Tracing (Fairness)🧩API ReferencePython SDKJava SDKR SDKRest APICustom Metrics Query LanguageGraphQL APIData API🏡On-Premise DeploymentOverview🔑Admin &amp; SettingsSSO &amp; RBAC (Role Based Access Control)Whitelisting📚ResourcesProduct FAQGlossaryML PlatformsCommon Industry Use Casesarize.comProduct Release NotesPhoenix OSSPowered By GitBookSHAPSHAP (Shapley Additive exPlanations) is a method used to break down individual predictions of a complex model​Visit the Shapley Values Documentation here to learn more ​Tree Shap TreeSHAP is a fast explainer used for analyzing decision tree models in the Shap python library. TreeSHAP is designed for tree-based machine learning models such as decision trees, random forests and gradient boosted trees. TreeSHAP is offered as a rapid, model-specific alternative to KernelSHAP; however, it can sometimes produce unintuitive feature attributions.​​Neural Network Explainer Deep explainer (deep SHAP) is an explainability technique that can be used for models with a neural network based architecture. This is the fastest neural network explainability approach and is based on running a SHAP-based version of the original deep lift algorithm. \\n​​Kernal ExplainerKernelSHAP is a slow, perturbation-based Shapley approach that theoretically works for all types of models but is rarely used by teams in the wild (at least in production). KernelSHAP tends to be way too slow to be used in practice extensively on anything but small data. It also tends to cause confusion among teams. When teams complain about SHAP being slow, usually it’s because they tested KernelSHAP. ​Code Example# 1. Generate the Shap Values and save as Dataframeexplainer = shap.TreeExplainer(tree_model)shap_values = explainer.shap_values(X_data)shap_dataframe = pd.DataFrame(        shap_values, columns=[f\"{fn}_shap\" for fn in data[\"feature_names\"]] )​# 2.Define the Schema. Link the feature column with its corresponding shap columnfeature_cols = [\"MERCHANT_TYPE\", \"ENTRY_MODE\", \"STATE\", \"MEAN_AMOUNT\", \"STD_AMOUNT\", \"TX_AMOUNT\"]shap_cols = shap_dataframe.columns​schema = Schema(    prediction_id_column_name=\"prediction_id\", ...    feature_column_names= feature_cols,    shap_values_column_names=dict(zip(feature_cols, shap_cols)),)​# Log the dataframe with the schema mapping response = arize_client.log(    model_id=\"sample-model-1\",    model_version= \"v1\",    model_type=ModelTypes.SCORE_CATEGORICAL,    environment=Environments.PRODUCTION,    dataframe=test_dataframe,    schema=schema,)Questions? Email us at [email protected] or Slack us in the #arize-support channelExplainability &amp; Fairness - PreviousModel ExplainabilityNextSurrogate ModelLast modified 10mo agoOn this pageTree Shap Neural Network Explainer Kernal ExplainerCode ExampleSupportResourcesGet Started Chat Us On SlackBlogSignup For Free[email protected]CourseBook A DemoSupportChat Us On Slack[email protected]ResourcesBlogCourseGet Started Signup For FreeBook A DemoCopyright © 2023 Arize AI, Inc\\n\\n\\n\\n\\n</td>\n",
                            "      <td>False</td>\n",
                            "    </tr>\n",
                            "  </tbody>\n",
                            "</table>\n",
                            "</div>"
                        ],
                        "text/plain": [
                            "     Unnamed: 0                                            input  \\\n",
                            "153         193         How do I load private images into Arize?   \n",
                            "104         132                         Can I log single events?   \n",
                            "172         216  What format should the prediction timestamp be?   \n",
                            "\n",
                            "                                                                              url  \\\n",
                            "153    https://docs.arize.com/arize/on-premise-deployment/on-premise/installation   \n",
                            "104                         https://docs.arize.com/arize/api-reference/python-sdk   \n",
                            "172  https://docs.arize.com/arize/explainability-and-fairness/explainability/shap   \n",
                            "\n",
                            "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               reference  \\\n",
                            "153  \\n\\n\\n\\n\\n\\nInstallation - Arize Docs\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCommunity SlackAsk or search…⌃KLinksArize AIWhat is ML Observability?What is LLM Observability?QuickstartAll Tutorials/Notebooks🪄Sending Data GuidesWhat Is A Model SchemaHow To Send Delayed ActualsFAQ & Troubleshoot Data UploadTable Ingestion Tuning🔌Sending Data MethodsPython Pandas SDKUI Drag & DropGoogle Cloud Storage (GCS)AWS S3Azure Blob StorageGoogle BigQueryDatabricksSnowflake🔢Model TypesLarge Language Models (LLM)Binary ClassificationMulti-Class ClassificationRegressionTimeseries ForecastingRankingNatural Language Processing (NLP)Image ClassificationObject Detection🔔MonitorsGet Started With MonitorsPerformance MonitorsDrift MonitorsData Quality MonitorsNotifications & Integrations🔎TracingPerformance TracingDrift TracingData Quality Troubleshooting🖌EmbeddingsGenerate EmbeddingsEmbedding DriftEmbedding & Cluster AnalyzerEmbeddings for Tabular Data (Multivariate Drift)Embeddings FAQ🦙LLM (Large Language Models)LLM EvaluationsPrompt EngineeringTroubleshoot Retrieval with Vector StoresOpen AI Cluster SummarizationCapturing User FeedbackIntegrations💡Active Learning and Fine TuningAutomate Model RetrainingExport Data to Notebook🎨dashboardsCreate A Dashboard🧙♂Explainability & FairnessModel ExplainabilityBias Tracing (Fairness)🧩API ReferencePython SDKJava SDKR SDKRest APICustom Metrics Query LanguageGraphQL APIData API🏡On-Premise DeploymentOverviewRequirementsInstallation🔑Admin & SettingsSSO & RBAC (Role Based Access Control)Whitelisting📚ResourcesProduct FAQGlossaryML PlatformsCommon Industry Use Casesarize.comProduct Release NotesPhoenix OSSPowered By GitBookInstallationInstallation Details for Arize On-Prem DeploymentOverviewThe installation requires a release's TAR file that will be supplied by the Arize team. The TAR file includes all the documentation, terraforms, and Helm charts to install the Arize platform.Example content:arize-distribution-<hash>.tar|-examples|-terraform|-docs |-install-arize-using-helm.md |...arize.sharize-operator-chart.tgzarize-cr-chart.tgzRead the install-arize-using-helm.md documentation for more detailed instructions on how to install on GCP, AWS, or Azure.1. Pre-Deployment The Arize team can help size the cluster based on customer requirements. Storage bucket entities need to be created for Arize A service account or IAM roles need to be created with access to the bucket storage and Kubernetes clusterIP address and VPC setup should be discussed with the Arize team. Our team can help pre-configure the files for network setup based on required deployment options.There are three options available for loading Arize container images:(default) Let the cluster pull images from the Arize Central Registry ch.hub.arize.comTransfer images from the Arize Central Registry to a private registryDownload the images to a local folder and then upload the images into a private registry2. DeploymentTo get started quickly, you can use the scripts provided with the distribution. Extract the TAR file provided by the Arize team:tar -zxvf arize-distribution-<hash>.tararize.sh is the main installation script. This uses kubectl and helm to install the Arize Operator onto your cluster. The Operator then deploys the application and initializes the database and various components. arize.sh command​NAME     arize.sh – Arize AI's On-Prem Deployment Utility Script​SYNOPSIS     ./arize.sh [OPTIONS] <OPERATION> <PARAMS>​DESCRIPTION​      Script for managing the Arize platform. The script will look for a 'values.yaml' file in the same      folder or a file name provided with the -f option. If not file is found the script will use default      values or values passed in as arguments in the form 'cloud=gcp,etc'.​OPERATIONS​      download-charts       Download the helm charts for the corresponding release install               Install the Arize Operator and CR charts from values.yaml​      install-air-gapped    Install in a air-gapped environment when Operator can not contact Arize hub      pull-images           Pull images from the Arize central registry to the local docker      push-images           Push images from the local docker to the remote registry      save-images           Save images from docker to a local images folder      load-remote-images    Combines the Pull and Push steps      load-images           Load images from a local images folder into docker ...​EXAMPLE COMMON INSTALL​      ./arize.sh install​EXAMPLE AIR-GAPPED​      ./arize.sh load-remote-images      ./arize.sh install ...The arize.sh script calls helm which takes settings from a values.yaml file. This file includes parameters such as:1.cloud: gcp/aws/azure2.clusterName: The cluster name on kubeconfig of the deployment 3.gazetteBucket: The bucket name to hold gazette events4.druidBucket: The storage bucket to hold ui data5.postgresPassword: The postgres db admin password6.organizationName: The name of the organization owning the deployment7.clusterSizing: The size of the deployment (small, medium, large, etc)8.smtpPassword: The password for the SMTP service9.smtpUser: The user for the SMTP service10.smtpHost: The host endpoint for the SMTP service11.smtpSenderEmail: The smtp authenticated address emails should come from. e.g. From: [email protected]12.gcpProject: (GCP only)The name of the project in GCP.13.gcpServiceAccountName: (GCP only)The name of the service account14.gcpServiceAccountJsonKey: (GCP only) A key from the service account15.azurePrincipalId: (Azure only) The id of the Azure principal16.region: (AWS only) Cluster region17.serverSideEncryption: (AWS only) Optional encryption settings (Example: KMS)18.sseKmsKeyId: (AWS only) Optional KMS encryption keyRunning the script deploys the Arize Operator which then executes a number of steps that include:Applying the secretsApplying the manifests Preparing the DatabaseStarting the consumer applications Finally starting the User Interface and SDK receiverOutput of the script will look as follows:    ----------------------------------------------------------------------------------------------                    Welcome to Arize AI's On-Prem Utility Script    ----------------------------------------------------------------------------------------------    Using:      ...​    ▶ Running pre-checks...    ▶ Helm install Arize Operator...    ...    ▶ Helm install Arize CR...    ...    ▶ Waiting for Operator pod to be running...    ▶ Waiting for Operator to complete: Executing    ▶ Waiting for Operator to complete: Running    ▶ Waiting for postgres job to complete...    ▶ Waiting for pods to be running...    ▶ Waiting for pods to be running...    ----------------------------------------------------------------------------------------------                                Installation Completed    ----------------------------------------------------------------------------------------------    ✅ Receivers available at http://localhost:50050    ✅ Application available at http://localhost:4040    ✅ Metrics available at http://localhost:3000    ✅ Alerts available at http://localhost:9090    ✅ Druid available at http://localhost:8888    ✅ Alert Manager available at http://localhost:9093After installation, endpoints for sending data from the SDK and for accessing the Platform UI are available for consumption by other applications running in the cluster.  These endpoints can be exposed to infrastructure outside of kubernetes through additional Ingress configuration.Initial login is based on the default login and password in the configuration setup.3. Post DeployAfter deployment, teams should confirm:Secrets have been appliedAll Arize Kubernetes services are green and upTest that the User Interface is live by accessing it at localhost:4040:The Arize team will typically work on completing the installation through help in setting up IP addresses, initial login accounts and testing the end to end system.Questions? Email us at [email protected] or Slack us in the #arize-support channelPreviousRequirementsNext - Admin & SettingsSSO & RBAC (Role Based Access Control)Last modified 7mo agoOn this pageOverview1. Pre-Deployment 2. Deployment3. Post DeploySupportResourcesGet Started Chat Us On SlackBlogSignup For Free[email protected]CourseBook A DemoSupportChat Us On Slack[email protected]ResourcesBlogCourseGet Started Signup For FreeBook A DemoCopyright © 2023 Arize AI, Inc\\n\\n\\n\\n\\n   \n",
                            "104                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           \\n\\n\\n\\n\\n\\nPython SDK - Arize Docs\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCommunity SlackAsk or search…⌃KLinksArize AIWhat is ML Observability?What is LLM Observability?QuickstartAll Tutorials/Notebooks🪄Sending Data GuidesWhat Is A Model SchemaHow To Send Delayed ActualsFAQ & Troubleshoot Data UploadTable Ingestion Tuning🔌Sending Data MethodsPython Pandas SDKUI Drag & DropGoogle Cloud Storage (GCS)AWS S3Azure Blob StorageGoogle BigQueryDatabricksSnowflake🔢Model TypesLarge Language Models (LLM)Binary ClassificationMulti-Class ClassificationRegressionTimeseries ForecastingRankingNatural Language Processing (NLP)Image ClassificationObject Detection🔔MonitorsGet Started With MonitorsPerformance MonitorsDrift MonitorsData Quality MonitorsNotifications & Integrations🔎TracingPerformance TracingDrift TracingData Quality Troubleshooting🖌EmbeddingsGenerate EmbeddingsEmbedding DriftEmbedding & Cluster AnalyzerEmbeddings for Tabular Data (Multivariate Drift)Embeddings FAQ🦙LLM (Large Language Models)LLM EvaluationsPrompt EngineeringTroubleshoot Retrieval with Vector StoresOpen AI Cluster SummarizationCapturing User FeedbackIntegrations💡Active Learning and Fine TuningAutomate Model RetrainingExport Data to Notebook🎨dashboardsCreate A Dashboard🧙♂Explainability & FairnessModel ExplainabilityBias Tracing (Fairness)🧩API ReferencePython SDKPandas Batch LoggingSingle Record LoggingChangelogJava SDKR SDKRest APICustom Metrics Query LanguageGraphQL APIData API🏡On-Premise DeploymentOverview🔑Admin & SettingsSSO & RBAC (Role Based Access Control)Whitelisting📚ResourcesProduct FAQGlossaryML PlatformsCommon Industry Use Casesarize.comProduct Release NotesPhoenix OSSPowered By GitBookPython SDKArize AI for Model Monitoring, Troubleshooting, and Explainability​  ​Use the Arize Python package to monitor machine learning predictions to observe your ML models and their features, predicted labels, and actual labels with just a few lines of code.Installing the packagepip install arizeIn addition to the basic functionality installed by the command above, the Arize SDK has additional functionality that can be installed with some extra dependencies:Auto Embeddings​ minimum required for Auto EmbeddingsWith this extra module, Arize extracts the embeddings in the appropriate way depending on your use case, and we return it to you to include in your Pandas DataFrame. Learn more here. To install the Arize package including this functionality:pip install arize[AutoEmbeddings]LLM Evaluation​ minimum required for LLM EvaluationWith this extra module, Arize helps you calculate evaluation metrics for your LLM Generative tasks. Learn more here. To install the Arize package including this functionality:pip install arize[LLM_Evaluation]Mimic Explainer​ minimum required for Mimic ExplainerWith this extra module, Arize gives the user the option to pass a flag with their request to send data that would produce SHAP values using the surrogate explainability approach. Learn more here. To install the Arize package including this functionality:pip install arize[MimicExplainer]Logging OptionsThe Arize Python SDK offers 2 ways of logging data into the platform:Pandas Batch LoggingDesigned for logging a batch of your model inferences using Pandas DataFrames. Go to the following page for more information.Pandas Batch LoggingSingle Record LoggingDesigned for low latency, one-at-a-time, logging of your model inferences. Go to the following page for more information.Single Record LoggingEnd of Support TableMajor ReleaseFirst ReleasedLatestSupport7.xJune, 2023​latest​Ends January 1st, 20266.xJanuary, 20236.1.3Ends January 1st, 20255.xAugust, 20225.5.0Ends October 1st, 20244.xMarch, 20224.2.2Ends June 1st, 20243.xSeptember, 20213.4.0Ends April 1st, 20242.xMarch, 20212.2.1Ended July 1st, 20231.xJuly, 20201.2.1Ended March 1st, 20220.xMarch, 20200.0.20Ended March 1st, 2022Explainability & Fairness - PreviousBias Tracing (Fairness)NextPandas Batch LoggingLast modified 29d agoOn this pageInstalling the packageLogging OptionsEnd of Support TableSupportResourcesGet Started Chat Us On SlackBlogSignup For Free[email protected]CourseBook A DemoSupportChat Us On Slack[email protected]ResourcesBlogCourseGet Started Signup For FreeBook A DemoCopyright © 2023 Arize AI, Inc\\n\\n\\n\\n\\n   \n",
                            "172                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     \\n\\n\\n\\n\\n\\nSHAP - Arize Docs\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nCommunity SlackAsk or search…⌃KLinksArize AIWhat is ML Observability?What is LLM Observability?QuickstartAll Tutorials/Notebooks🪄Sending Data GuidesWhat Is A Model SchemaHow To Send Delayed ActualsFAQ & Troubleshoot Data UploadTable Ingestion Tuning🔌Sending Data MethodsPython Pandas SDKUI Drag & DropGoogle Cloud Storage (GCS)AWS S3Azure Blob StorageGoogle BigQueryDatabricksSnowflake🔢Model TypesLarge Language Models (LLM)Binary ClassificationMulti-Class ClassificationRegressionTimeseries ForecastingRankingNatural Language Processing (NLP)Image ClassificationObject Detection🔔MonitorsGet Started With MonitorsPerformance MonitorsDrift MonitorsData Quality MonitorsNotifications & Integrations🔎TracingPerformance TracingDrift TracingData Quality Troubleshooting🖌EmbeddingsGenerate EmbeddingsEmbedding DriftEmbedding & Cluster AnalyzerEmbeddings for Tabular Data (Multivariate Drift)Embeddings FAQ🦙LLM (Large Language Models)LLM EvaluationsPrompt EngineeringTroubleshoot Retrieval with Vector StoresOpen AI Cluster SummarizationCapturing User FeedbackIntegrations💡Active Learning and Fine TuningAutomate Model RetrainingExport Data to Notebook🎨dashboardsCreate A Dashboard🧙♂Explainability & FairnessModel ExplainabilitySHAPSurrogate ModelBias Tracing (Fairness)🧩API ReferencePython SDKJava SDKR SDKRest APICustom Metrics Query LanguageGraphQL APIData API🏡On-Premise DeploymentOverview🔑Admin & SettingsSSO & RBAC (Role Based Access Control)Whitelisting📚ResourcesProduct FAQGlossaryML PlatformsCommon Industry Use Casesarize.comProduct Release NotesPhoenix OSSPowered By GitBookSHAPSHAP (Shapley Additive exPlanations) is a method used to break down individual predictions of a complex model​Visit the Shapley Values Documentation here to learn more ​Tree Shap TreeSHAP is a fast explainer used for analyzing decision tree models in the Shap python library. TreeSHAP is designed for tree-based machine learning models such as decision trees, random forests and gradient boosted trees. TreeSHAP is offered as a rapid, model-specific alternative to KernelSHAP; however, it can sometimes produce unintuitive feature attributions.​​Neural Network Explainer Deep explainer (deep SHAP) is an explainability technique that can be used for models with a neural network based architecture. This is the fastest neural network explainability approach and is based on running a SHAP-based version of the original deep lift algorithm. \\n​​Kernal ExplainerKernelSHAP is a slow, perturbation-based Shapley approach that theoretically works for all types of models but is rarely used by teams in the wild (at least in production). KernelSHAP tends to be way too slow to be used in practice extensively on anything but small data. It also tends to cause confusion among teams. When teams complain about SHAP being slow, usually it’s because they tested KernelSHAP. ​Code Example# 1. Generate the Shap Values and save as Dataframeexplainer = shap.TreeExplainer(tree_model)shap_values = explainer.shap_values(X_data)shap_dataframe = pd.DataFrame(        shap_values, columns=[f\"{fn}_shap\" for fn in data[\"feature_names\"]] )​# 2.Define the Schema. Link the feature column with its corresponding shap columnfeature_cols = [\"MERCHANT_TYPE\", \"ENTRY_MODE\", \"STATE\", \"MEAN_AMOUNT\", \"STD_AMOUNT\", \"TX_AMOUNT\"]shap_cols = shap_dataframe.columns​schema = Schema(    prediction_id_column_name=\"prediction_id\", ...    feature_column_names= feature_cols,    shap_values_column_names=dict(zip(feature_cols, shap_cols)),)​# Log the dataframe with the schema mapping response = arize_client.log(    model_id=\"sample-model-1\",    model_version= \"v1\",    model_type=ModelTypes.SCORE_CATEGORICAL,    environment=Environments.PRODUCTION,    dataframe=test_dataframe,    schema=schema,)Questions? Email us at [email protected] or Slack us in the #arize-support channelExplainability & Fairness - PreviousModel ExplainabilityNextSurrogate ModelLast modified 10mo agoOn this pageTree Shap Neural Network Explainer Kernal ExplainerCode ExampleSupportResourcesGet Started Chat Us On SlackBlogSignup For Free[email protected]CourseBook A DemoSupportChat Us On Slack[email protected]ResourcesBlogCourseGet Started Signup For FreeBook A DemoCopyright © 2023 Arize AI, Inc\\n\\n\\n\\n\\n   \n",
                            "\n",
                            "     is_correct_ref_link  \n",
                            "153                 True  \n",
                            "104                 True  \n",
                            "172                False  "
                        ]
                    },
                    "execution_count": 6,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "df = (\n",
                "    pd.read_csv(\n",
                "        \"https://storage.googleapis.com/arize-phoenix-assets/evals/ref-link-classification/ref_link_golden_test_data.csv\",\n",
                "    )\n",
                "    .sample(n=N_EVAL_SAMPLE_SIZE)\n",
                "    .rename(columns={\"conversation\": \"input\", \"document_text\": \"reference\"})\n",
                ")\n",
                "df.head(3)"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 7,
            "metadata": {
                "cellView": "form",
                "id": "naFp1e8KsoeS"
            },
            "outputs": [],
            "source": [
                "# @title Download Text HTML (optional)\n",
                "# HTML Ref Link Pages\n",
                "# This section is not used by default, data is preloaded in saved file\n",
                "# This is used to convert URLs to text in a dataframe, this downloader\n",
                "# Assumes HTML as the Ref Link webpage (not usable with JS rendered pages)\n",
                "if DOWNLOAD_TEXT_FROM_URL:\n",
                "    from llama_index import download_loader\n",
                "\n",
                "    BeautifulSoupWebReader = download_loader(\"BeautifulSoupWebReader\")\n",
                "    loader = BeautifulSoupWebReader()\n",
                "\n",
                "    def download_url_text(url):\n",
                "        try:\n",
                "            # Use loader.load_data from llama to download the document\n",
                "            documents = loader.load_data(urls=[url])\n",
                "\n",
                "            # Assuming documents is a list-like object with text as an attribute\n",
                "            if documents and hasattr(documents[0], \"text\"):\n",
                "                return documents[0].text\n",
                "            else:\n",
                "                # If documents is empty or doesn't have the text attribute\n",
                "                return None\n",
                "        except Exception as e:\n",
                "            # General exception handling, it's better to use more specific exceptions\n",
                "            print(f\"Error loading document from {url}: {e}\")\n",
                "            return None\n",
                "\n",
                "    # Apply the function to your dataframe to get the text for each URL\n",
                "    df[\"reference\"] = df[\"url\"].apply(download_url_text)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "EniFqcSY8Utk"
            },
            "source": [
                "## Display Binary Ref Link Eval Template\n",
                "\n",
                "This Eval template checks for correct link based on a question or conversation, it checks whether the text from the page that the URL reference link refers, correctly answers the quesiton."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 8,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/"
                },
                "id": "oQpg82u48Utk",
                "outputId": "bba21006-5f9a-402e-ebab-fa1a7fc69b2f"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "\n",
                        "You are given a conversation that contains questions by a CUSTOMER and you are\n",
                        "trying to determine if the documentation page shared by the ASSISTANT correctly\n",
                        "answers the CUSTOMERS questions. We will give you the conversation between the\n",
                        "customer and the ASSISTANT and the text of the documentation returned:\n",
                        "    [CONVERSATION AND QUESTION]:\n",
                        "    {input}\n",
                        "    ************\n",
                        "    [DOCUMENTATION URL TEXT]:\n",
                        "    {reference}\n",
                        "    ************\n",
                        "You should respond \"correct\" if the documentation text answers the question the\n",
                        "CUSTOMER had in the conversation. If the documentation roughly answers the\n",
                        "question even in a general way the please answer \"correct\". If there are\n",
                        "multiple questions and a single question is answered, please still answer\n",
                        "\"correct\". If the text does not answer the question in the conversation, or\n",
                        "doesn't contain information that would allow you to answer the specific question\n",
                        "please answer \"incorrect\".\n",
                        "\n"
                    ]
                }
            ],
            "source": [
                "print(REFERENCE_LINK_CORRECTNESS_PROMPT_TEMPLATE)"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "N3ExsoHz8Utl"
            },
            "source": [
                "Template variables:\n",
                "- **input** : The customer and assistant conversation, where the assistants supplies a link to answer the customers question\n",
                "- **reference** : The content of the text from the page that was supplied in the link\n"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "s-j4sm1p8Utl"
            },
            "source": [
                "## Configure the LLM\n",
                "\n",
                "Configure your OpenAI API key."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 9,
            "metadata": {
                "id": "M_1sOC_V8Utl"
            },
            "outputs": [],
            "source": [
                "if not (openai_api_key := os.getenv(\"OPENAI_API_KEY\")):\n",
                "    openai_api_key = getpass(\"🔑 Enter your OpenAI API key: \")\n",
                "openai.api_key = openai_api_key\n",
                "os.environ[\"OPENAI_API_KEY\"] = openai_api_key"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "UI5f3UTN8Utm"
            },
            "source": [
                "## LLM Evals: Reference Link Classifications GPT-4\n",
                "Run reference link classifications against a subset of the data."
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "p90W_Qgp8Utm"
            },
            "source": [
                "Instantiate the LLM and set parameters."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 10,
            "metadata": {
                "id": "iGBgyW6-8Utm"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                }
            ],
            "source": [
                "model = OpenAIModel(\n",
                "    model=\"gpt-4\",\n",
                "    temperature=0.0,\n",
                ")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 11,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 35
                },
                "id": "LQyFQw-F8Utm",
                "outputId": "c051941e-43ef-4d53-a83a-ebba5dbd6561"
            },
            "outputs": [
                {
                    "data": {
                        "text/plain": [
                            "\"Hello! I'm working perfectly. How can I assist you today?\""
                        ]
                    },
                    "execution_count": 11,
                    "metadata": {},
                    "output_type": "execute_result"
                }
            ],
            "source": [
                "model(\"Hello world, this is a test if you are working?\")"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": null,
            "metadata": {
                "colab": {
                    "background_save": true,
                    "base_uri": "https://localhost:8080/",
                    "height": 49,
                    "referenced_widgets": [
                        "4f978fb80b284000bcdf924e75fce7d6",
                        "6c463eee458a4f0f8ff7bab452294e6d",
                        "8b01367da83c4df88a2844ed63837802",
                        "d6dbae84218348bd86e3938636a67248",
                        "97971f310e504be78048d7516f684356",
                        "ca1f8130c01440ac8b49e758c8392b0a",
                        "ddabbf7048124b5b971e2f2539b71b57",
                        "56b19d7b9f6e477f95f9f2a2dd45584c",
                        "6e7094c3c45d46e1a549f3e3d40bfdfc",
                        "d752abb65748466d9c073e77f975dbe1",
                        "cc7e5c7ce5944d668dcc4de558385096"
                    ]
                },
                "id": "WLUGCls98Utm",
                "outputId": "6586430e-4af2-4007-84cd-6ccd3ff2b4ad"
            },
            "outputs": [],
            "source": [
                "# The rails fore the output to specific values of the template\n",
                "# It will remove text such as \",,,\" or \"...\", anything not the\n",
                "# binary value expected from the template\n",
                "rails = list(REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP.values())\n",
                "ref_link_classifications = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=REFERENCE_LINK_CORRECTNESS_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=rails,\n",
                "    concurrency=20,\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "LWndWjYJ8Utn"
            },
            "source": [
                "Evaluate the predictions against human-labeled ground-truth labels."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 13,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 651
                },
                "id": "kYEniD1g8Utn",
                "outputId": "ed5ac39e-7906-4343-dbba-dd19026ee1f9"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "     correct       0.93      0.84      0.89       115\n",
                        "   incorrect       0.76      0.89      0.82        65\n",
                        "\n",
                        "    accuracy                           0.86       180\n",
                        "   macro avg       0.85      0.87      0.85       180\n",
                        "weighted avg       0.87      0.86      0.86       180\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 13,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"is_correct_ref_link\"].map(REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP).tolist()\n",
                "df[\"true_labels\"] = true_labels\n",
                "df[\"qa_evals\"] = ref_link_classifications\n",
                "print(classification_report(true_labels, ref_link_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels,\n",
                "    predict_vector=list(ref_link_classifications),\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "ZY7xzQYc8Utn"
            },
            "source": [
                "## LLM Evals: Reference Link Classifications GPT-3.5\n",
                "\n",
                "Run reference link evaluations against a subset of the data."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 20,
            "metadata": {
                "id": "skQD9nXa8Utn"
            },
            "outputs": [],
            "source": [
                "model = OpenAIModel(model=\"gpt-3.5-turbo-16k\", temperature=0.0, request_timeout=20)"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 15,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 49,
                    "referenced_widgets": [
                        "0185c73040664f3aaf0aa9879094285d",
                        "10787ef7b5eb4755a4eddce23a176297",
                        "205d77c24b1c4cc68f44456a6c26aded",
                        "8b79190d70df401d99bbf5f76c791f04",
                        "6d7c95c558a246f8b09066ba03348c9c",
                        "3d44d6062e8f4e84b8ded75b39894c49",
                        "9059e4f943314e11a39366c0b10787e2",
                        "b2507e55781f435fa72500a64f17af83",
                        "f1b4f0130a31485eaa7199aba9052599",
                        "a64e823f48d048c4a25e001e974f11e8",
                        "0252fb16ec714eda8d23dea03a46e2c6"
                    ]
                },
                "id": "OI_lMT658Utn",
                "outputId": "02be7f0c-52fb-4ae9-e8b2-8220cd3b7dce"
            },
            "outputs": [
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "5455a020877b4a39a18f46de9905a9d0",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/180 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "rails = list(REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP.values())\n",
                "ref_link_classifications = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=REFERENCE_LINK_CORRECTNESS_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=rails,\n",
                "    concurrency=20,\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 16,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 651
                },
                "id": "r-SeadL38Utn",
                "outputId": "57e9c941-f805-42fb-eb5a-a51ac31e2267"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "     correct       0.86      0.53      0.66       115\n",
                        "   incorrect       0.50      0.85      0.63        65\n",
                        "\n",
                        "    accuracy                           0.64       180\n",
                        "   macro avg       0.68      0.69      0.64       180\n",
                        "weighted avg       0.73      0.64      0.65       180\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 16,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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1qldJitERETGSC7Tz6aDefPmYfjw4QgPD4ePjw8WL14Mc3NzrFy5stTjDxw4gODgYAwcOBAeHh7o0qULBgwY8MTemBKXqtPRREREZBgqPASk25yX/Px8HDlyBCEhIVKZXC5HSEgIYmNjSz2ndevWOHLkiJScXLlyBdu3b0f37t11ulROsCUiIqrmMjMztV6rVCqoVCqtsrS0NBQWFsLJyUmr3MnJCefOnSu13oEDByItLQ1t2rSBEAIFBQV48803OQxERERULRTfZ6WiGwA3NzfY2NhIW1RUlF5C3LNnD2bOnImvvvoKR48exZYtW7Bt2zZMnz5dp3rYs0JERGSM9Lh0OTExEdbW1lLxo70qAGBvbw+FQoHk5GSt8uTkZDg7O5da/aRJkzB48GAMGzYMAODr64ucnByMGDECEyZMgFxevvjZs0JERFTNWVtba22lJStKpRItWrRATEyMVKbRaBATE4OgoKBS683NzS2RkCgUCgCAEKLc8bFnhYiIyBhVwe32IyIiEBYWhoCAALRq1QrR0dHIyclBeHg4AGDIkCFwdXWVhpF69eqFefPmoVmzZggMDMSlS5cwadIk9OrVS0payoPJChERkTGqgjvY9uvXD6mpqZg8eTKSkpLg7++PHTt2SJNur127ptWTMnHiRMhkMkycOBE3btyAg4MDevXqhRkzZugWptClH4YqXWZmJmxsbPDq0j+hNLOs6nCIKkVdB7OqDoGoUuTlZGP2Sy2QkZGhNQdEn4r/Tqg6TofMRF2hukTBfeT9NqlS49UHzlkhIiIig8ZhICIiImNUjR5kyGSFiIjIGFXBBNuqYhwpFREREVVb7FkhIiIySnoYBjKSPgsmK0RERMaIw0BEREREhoE9K0RERMZIJtPDaiDj6FlhskJERGSMqtHSZeOIkoiIiKot9qwQEREZo2o0wZbJChERkTGqRsNATFaIiIiMUTXqWTGOlIqIiIiqLfasEBERGSMOAxEREZFB4zAQERERkWFgzwoREZERkslkkFWTnhUmK0REREaoOiUrHAYiIiIig8aeFSIiImMk+2eraB1GgMkKERGREeIwEBEREZGBYM8KERGREapOPStMVoiIiIwQkxUiIiIyaNUpWeGcFSIiIjJo7FkhIiIyRly6TERERIaMw0BEREREBoI9K0REREZIJoMeelb0E0tlY7JCRERkhGTQ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Cfjmm2/wxRdfVCgYIiIiokfp3LOSm5sLKysrAMDOnTvRt29fyOVyPPfcc0hISNB7gERERFSSDHoYBtJLJJVP554VLy8vbN26FYmJifj111+leSopKSlay56IiIio8shlMr1sxkDnZGXy5Mn44IMP4OHhgVatWknLlXbu3IlmzZrpPUAiIiKq3nQeBnr55ZfRpk0b3Lp1C35+flJ5p06d0KdPH70GR0RERKWritVAVeWp7rPi7OwMKysr7Nq1C/fu3QMAtGzZEg0bNtRrcERERFS6Z/0gw6qkc7Jy+/ZtdOrUCQ0aNED37t1x69YtAMAbb7yBsWPH6j1AIiIiKkku089mDHROVt5//32Ympri2rVr0o3hgKIbxezYsUOvwRERERHpPGdl586d+PXXX1G7dm2t8vr163PpMhER0bMie7qbuj1ahzHQOVnJycnR6lEplp6eXuqDj4iIiEj/OMH2Mdq2bYtvvvlGei2TyaDRaDB79mx06NBBr8ERERER6dyzMnv2bHTq1AmHDx9Gfn4+xo0bh9OnTyM9PR379++vjBiJiIjoEbJ//qtoHcZA556VJk2a4MKFC2jTpg169+6NnJwc9O3bF8eOHYOnp2dlxEhERESPqE6rgXTuWQEAGxsbTJgwQd+xEBEREZWgc8/Kjh078Oeff0qvFy5cCH9/fwwcOBB37tzRa3BERERUOt4U7jE+/PBDZGZmAgBOnjyJiIgIdO/eHfHx8YiIiNB7gERERFRS8Wqgim7GQOdhoPj4ePj4+AAANm/ejF69emHmzJk4evQounfvrvcAiYiIqHrTuWdFqVQiNzcXALB792506dIFAGBnZyf1uBAREVHlkstketmMgc49K23atEFERASCg4Nx8OBBbNiwAQBw4cKFEne1JSIiosrBm8I9xpdffgkTExNs2rQJixYtgqurKwDgl19+Qbdu3fQeIBEREZVUnSbY6tyzUqdOHfz8888lyufPn6+XgIiIiIgepnPPytGjR3Hy5Enp9Q8//IDQ0FB8/PHHyM/P12twREREVLrqtBpI52Rl5MiRuHDhAgDgypUr6N+/P8zNzbFx40aMGzdO7wESERFRSdVpgq3OycqFCxfg7+8PANi4cSOef/55rF+/HqtWrcLmzZv1HR8RERFVczrPWRFCQKPRAChautyzZ08AgJubG9LS0vQbHREREZVK9s9W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4q233kJqaiqWLl2q9wCJiIioetO5ZyUgIED6t6OjI3bs2KHXgIiIiOjJZLKK39TtPzsMRERERFWvOi1d1jlZqVu3LmSPuborV65UKCAiIiKih+mcrIwZM0br9YMHD3Ds2DHs2LEDH374ob7iIiIioseoThNsdU5WRo8eXWr5woULcfjw4QoHRERERE8m++e/itZhDPT2DKMXXngBmzdv1ld1RERE9BjFPSsV3YyB3pKVTZs2wc7OTl/VEREREQF4ypvCPTzBVgiBpKQkpKam4quvvtJrcERERFQ6zll5jN69e2slK3K5HA4ODmjfvj0aNmyo1+CIiIiodDKZ7LGrc8tbhzHQOVmZMmVKJYRBREREVDqd56woFAqkpKSUKL99+zYUCoVegiIiIqLHq04TbHXuWRFClFqel5cHpVJZ4YCIiIjoyXgH21J88cUXAIrGt5YvXw5LS0tpX2FhIfbu3cs5K0RERKR35U5W5s+fD6CoZ2Xx4sVaQz5KpRIeHh5YvHix/iMkIiKiEuQyWYUfZFjR85+Vcicr8fHxAIAOHTpgy5YtsLW1rbSgiIiI6PG4dPkxfv/998qIg4iIiKhUOq8Geumll/Dpp5+WKJ89ezZeeeUVvQRFRERETyD7d5Lt025G8mgg3ZOVvXv3onv37iXKX3jhBezdu1cvQREREdHjySHTy2YMdB4Gys7OLnWJsqmpKTIzM/USFBERET1edVq6rHPPiq+vLzZs2FCi/LvvvoOPj49egiIiIiIqpnPPyqRJk9C3b19cvnwZHTt2BADExMTg22+/xcaNG/UeIBEREZXE1UCP0atXL2zduhUzZ87Epk2bYGZmhqZNm2L37t1o165dZcRIREREj+B9Vp6gR48e6NGjR4nyU6dOoUmTJhUOioiIiKiYznNWHpWVlYWlS5eiVatW8PPz00dMRERE9AQVXbasjwm6z8pTJyt79+7FkCFD4OLigrlz56Jjx47466+/9BkbERERlUEOmTQU9NTbf3HpclJSElatWoUVK1YgMzMTr776KvLy8rB161auBCIiIqJKUe6elV69esHb2xsnTpxAdHQ0bt68iQULFlRmbERERFSG6jQMVO6elV9++QXvvfce3nrrLdSvX78yYyIiIqInkKPiE08rPHH1GSl3nH/++SeysrLQokULBAYG4ssvv0RaWlplxkZERERU/mTlueeew7Jly3Dr1i2MHDkS3333HWrVqgWNRoNdu3YhKyurMuMkIiKih8hkMr1sxkDnHiALCwu8/vrr+PPPP3Hy5EmMHTsWs2bNgqOjI1588cXKiJGIiIgeIdPTpquFCxfCw8MDarUagYGBOHjwYLnO++677yCTyRAaGqpzmxUarvL29sbs2bNx/fp1fPvttxWpioiIiHRQ4WXLT3EH3A0bNiAiIgKRkZE4evQo/Pz80LVrV6SkpDz2vKtXr+KDDz5A27Ztn+5an+qsRygUCoSGhuLHH3/UR3VERERkgObNm4fhw4cjPDwcPj4+WLx4MczNzbFy5coyzyksLMSgQYMwdepU1KtX76naNZaJwERERPQIfQ0BZWZmam15eXkl2srPz8eRI0cQEhIilcnlcoSEhCA2NrbMGKdNmwZHR0e88cYbT32dTFaIiIiMkD7vs+Lm5gYbGxtpi4qKKtFeWloaCgsL4eTkpFXu5OSEpKSkUmP8888/sWLFCixbtqxC1/pUDzIkIiKi/47ExERYW1tLr1UqVYXrzMrKwuDBg7Fs2TLY29tXqC4mK0REREZIH0uPi8+3trbWSlZKY29vD4VCgeTkZK3y5ORkODs7lzj+8uXLuHr1Knr16iWVaTQaAICJiQnOnz8PT0/PcsXJYSAiIiIjJNfTVl5KpRItWrRATEyMVKbRaBATE4OgoKASxzds2BAnT55EXFyctL344ovo0KED4uLi4ObmVu622bNCRERE5RIREYGwsDAEBASgVatWiI6ORk5ODsLDwwEAQ4YMgaurK6KioqBWq9GkSROt82vUqAEAJcqfhMkKERGREdLnMFB59evXD6mpqZg8eTKSkpLg7++PHTt2SJNur127Brlc/4M2TFaIiIiM0NPegfbROnQ1atQojBo1qtR9e/bseey5q1ateooWOWeFiIiIDBx7VoiIiIxQVQwDVRUmK0REREZI19U8ZdVhDJisEBERGaHq1LNiLEkVERERVVPsWSEiIjJCVbUaqCowWSEiIjJCDz+IsCJ1GAMOAxEREZFBY88KERGREZJDBnkFB3Iqev6zwmSFiIjICHEYiIiIiMhAsGeFiIjICMn++a+idRgDJitERERGiMNARERERAaCPStERERGSKaH1UAcBiIiIqJKU52GgZisEBERGaHqlKxwzgoREREZNPasEBERGSEuXSYiIiKD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oaqYYFtVuHSZiIiIDBp7VoiIiIxRNepaYbJCRERkhKrTBFsOAxEREZFBY88KERGREeJqICIiIjJo1WjKCoeBiIiIyLCxZ4WIiMgYVaOuFSYrRERERoirgYiIiIgMBHtWiIiIjBBXAxEREZFBq0ZTVpisEBERGaVqlK1wzgoREREZNPasEBERGaHqtBqIyQoREZEx0sMEWyPJVTgMRERERIaNPStERERGqBrNr2WyQkREZJSqUbbCYSAiIiIyaOxZISIiMkJcDUREREQGrTrdbp/DQERERGTQ2LNCRERkhKrR/FomK0REREapGmUrTFaIiIiMUHWaYMs5K0RERGTQ2LNCRERkhGTQw2ogvURS+ZisEBERGaFqNGWFw0BERERk2NizQkREZISq003hmKwQEREZpeozEMRhICIiIjJo7FkhIiIyQhwGIiIiIoNWfQaBOAxEREREBo49K0REREaIw0BERERk0KrTs4GYrBARERmjajRphXNWiIiIyKAxWSEiIjJCMj1tulq4cCE8PDygVqsRGBiIgwcPlnnssmXL0LZtW9ja2sLW1hYhISGPPb4sTFaIiIiMUPEE24puutiwYQMiIiIQGRmJo0ePws/PD127dkVKSkqpx+/ZswcDBgzA77//jtjYWLi5uaFLly64ceOGTu0yWSEiIqJymTdvHoYPH47w8HD4+Phg8eLFMDc3x8qVK0s9ft26dXj77bfh7++Phg0bYvny5dBoNIiJidGpXSYrRERERkimp/8AIDMzU2vLy8sr0V5+fj6OHDmCkJAQqUwulyMkJASxsbHlijk3NxcPHjyAnZ2dTtfKZIWIiMgY6XHSipubG2xsbKQtKiqqRHNpaWkoLCyEk5OTVrmTkxOSkpLKFfL48eNRq1YtrYSnPLh0mYiIqJpLTEyEtbW19FqlUum9jVmzZuG7777Dnj17oFardTqXyQoREZER0udtVqytrbWSldLY29tDoVAgOTlZqzw5ORnOzs6PPXfu3LmYNWsWdu/ejaZNm+ocJ4eBiIiIjNCzXg2kVCrRokULrcmxxZNlg4KCyjxv9uzZmD59Onbs2IGAgICnulb2rBAREVG5REREICwsDAEBAWjVqhWio6ORk5OD8PBwAMCQIUPg6uoqzXn59NNPMXnyZKxfvx4eHh7S3BZLS0tYWlqWu10mK0REREap4s8G0nUgqV+/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",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"is_correct_ref_link\"].map(REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP).tolist()\n",
                "\n",
                "print(classification_report(true_labels, ref_link_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels,\n",
                "    predict_vector=ref_link_classifications,\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {
                "id": "k4FFeBLYOTc-"
            },
            "source": [
                "## LLM Evals: Ref Link Evaluations GPT-4 Turbo\n",
                "Run evaluations of the reference link against the data"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 17,
            "metadata": {
                "id": "iNH2a-biOd0c"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
                    ]
                }
            ],
            "source": [
                "model = OpenAIModel(model=\"gpt-4-turbo-preview\", temperature=0.0)"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 18,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 49,
                    "referenced_widgets": [
                        "bc1166807304402f880ea640c320e1ed",
                        "21e2b03968f849ceae7defad60b74258",
                        "164802686edb473b926c5abf3a12683a",
                        "e376948cf55a4ab788df05e4af71e649",
                        "3fefb750d6904f8eaf85ad9776effaad",
                        "f52cded2f0064c85b0919a7f6270a8f0",
                        "eaa9646440884096961cc90b3040949d",
                        "0c1d5a8a7f5a45c98fe9697c4f0f2313",
                        "244948dc2fe0425ab2f9115c95777c42",
                        "b45f43d172e44a9a97401ba7ecf1e203",
                        "9004be51b5324bbaa4ead60867963dd7"
                    ]
                },
                "id": "n01_x3KROg9I",
                "outputId": "6da2a247-637d-4c7e-97bf-594b958efc46"
            },
            "outputs": [
                {
                    "data": {
                        "application/vnd.jupyter.widget-view+json": {
                            "model_id": "b9347c32ca6e49e2b197551b49b0e32d",
                            "version_major": 2,
                            "version_minor": 0
                        },
                        "text/plain": [
                            "llm_classify |          | 0/180 (0.0%) | ⏳ 00:00<? | ?it/s"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "rails = list(REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP.values())\n",
                "ref_link_classifications = llm_classify(\n",
                "    dataframe=df,\n",
                "    template=REFERENCE_LINK_CORRECTNESS_PROMPT_TEMPLATE,\n",
                "    model=model,\n",
                "    rails=rails,\n",
                "    concurrency=20,\n",
                ")[\"label\"].tolist()"
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 19,
            "metadata": {
                "colab": {
                    "base_uri": "https://localhost:8080/",
                    "height": 651
                },
                "id": "J0e3igmUOian",
                "outputId": "ddccf58b-6312-4f8f-da5f-cd18cb6e042a"
            },
            "outputs": [
                {
                    "name": "stdout",
                    "output_type": "stream",
                    "text": [
                        "              precision    recall  f1-score   support\n",
                        "\n",
                        "     correct       0.98      0.74      0.84       115\n",
                        "   incorrect       0.68      0.97      0.80        65\n",
                        "\n",
                        "    accuracy                           0.82       180\n",
                        "   macro avg       0.83      0.85      0.82       180\n",
                        "weighted avg       0.87      0.82      0.83       180\n",
                        "\n"
                    ]
                },
                {
                    "data": {
                        "text/plain": [
                            "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
                        ]
                    },
                    "execution_count": 19,
                    "metadata": {},
                    "output_type": "execute_result"
                },
                {
                    "data": {
                        "image/png": "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SKtxGIiIiIhIO7BnhYiISCdpYBhIR/osmKwQERHpIg4DEREREWkH9qwQERHpIolEA6uBdKNnhckKERGRLtKjpcu6ESURERHpLfasEBER6SI9mmDLZIWIiEgX6dEwEJMVIiIiXaRHPSu6kVIRERGR3mLPChERkS7iMBARERFpNQ4DEREREWkH9qwQERHpIIlEAome9KwwWSEiItJB+pSscBiIiIiItBp7VoiIiHSR5J+tpG3oACYrREREOojDQERERERagj0rREREOkifelaYrBAREekgJitERESk1fQpWeGcFSIiItJq7FkhIiLSRVy6TERERNqMw0BEREREWoI9K0RERDpIIoEGelY0E0tpY88KERGRDpJAohwKeuPtDbKVJUuWwN3dHcbGxmjUqBFOnz79yvrh4eGoVq0aTExM4OrqitGjRyMzM1OtczJZISIiomLZvHkzgoODERISgnPnzqFOnTpo06YNEhISiqy/ceNG/O9//0NISAguX76M7777Dps3b8aXX36p1nmZrBAREemgEveqvMEE3QULFmDw4MHo378/atSogWXLlsHU1BSrV68usv6JEyfg7++PXr16wd3dHa1bt0bPnj1f2xvzIiYrREREukiioa2YsrOzcfbsWQQEBCjLpFIpAgICcPLkySKPady4Mc6ePatMTm7duoW9e/eiXbt26lwpJ9gSERHpu9TUVJWv5XI55HK5SllSUhLy8vLg4OCgUu7g4IArV64U2W6vXr2QlJSEd999F0II5Obm4pNPPuEwEBERkV7QxBDQP8NArq6usLKyUm5hYWEaCfHIkSOYNWsWvv32W5w7dw7bt2/Hnj17MH36dLXaYc8KERGRDtLEQ+EKjo+NjYWlpaWy/MVeFQCwtbWFgYEB4uPjVcrj4+Ph6OhYZPuTJ09Gnz59MGjQIACAt7c3MjIyMGTIEEycOBFSafH6TNizQkREpIM0OcHW0tJSZSsqWZHJZKhfvz4iIyOVZQqFApGRkfDz8ysyxqdPnxZKSAwMDAAAQohiXyt7VoiIiKhYgoODERQUBF9fXzRs2BDh4eHIyMhA//79AQB9+/aFi4uLchipY8eOWLBgAerWrYtGjRrhxo0bmDx5Mjp27KhMWoqDyQoREZEuKoMPMuzevTsSExMxZcoUxMXFwcfHB/v27VNOur17965KT8qkSZMgkUgwadIk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z8/vpcfNmTMH06dPx759++Dr66vGGf/FnhUiIiIqluDgYAQFBcHX1xcNGzZEeHg4MjIy0L9/fwBA37594eLiopzz8tVXX2HKlCnYuHEj3N3dlXNbzM3NYW5uXuzzMlkhIiLSRWXw2UDdu3dHYmIipkyZgri4OPj4+GDfvn3KSbd3796FVPrvoM3SpUuRnZ2Nbt26qbQTEhKC0NDQYp+XyQoREZEOKqvH7Q8fPhzDhw8vct+RI0dUvr59+/YbRFUY56wQERGRVmPPChERkQ7S5GogbcdkhYiISAeVwZSVMsNkhYiISBfpUbbCOStERESk1dizQkREpIPKajVQWWCyQkREpIs0MMFWR3IVDgMRERGRdmPPChERkQ7So/m1TFaIiIh0kh5lKxwGIiIiIq3GnhUiIiIdxNVAREREpNX06XH7HAYiIiIircaeFSIiIh2kR/NrmawQERHpJD3KVpisEBER6SB9mmDLOStERESk1dizQkREpIMk0MBqII1EUvqYrBAREekgPZqywmEgIiIi0m7sWSEiItJB+vRQOCYrREREOkl/BoI4DERERERajT0rREREOojDQERERKTV9GcQiMNAREREpOXYs0JERKSDOAxEREREWk2fPhuIyQoREZEu0qNJK5yzQkRERFqNPStEREQ6SI86VpisEBER6SJ9mmDLYSAiIiLSauxZISIi0kFcDURERETaTY8mrXAYiIiIiLQae1aIiIh0kB51rDBZISIi0kVcDURERESkJdizQkREpJNKvhpIVwaCmKwQERHpIA4DEREREWkJJitERESk1TgMREREpIP0aRiIyQoREZEO0qfH7XMYiIiIiLQae1aIiIh0EIeBiIiISKvp0+P2OQxEREREWo09K0RERLpIj7pWmKwQERHpIK4GIiIiItIS7FkhIiLSQVwNRERERFpNj6asMFkhIiLSSXqUrXDOChEREWk19qwQERHpIH1aDcRkhYiISAdxgi2VGSEEACAtNbWMIyEqPSIvu6xDICoVBa/tgt/lpSlVA+8TmmjjbWCyomXS0tIAAJ6VXMs4EiIielNpaWmwsrIqlbZlMhkcHR1RRUPvE46OjpDJZBppq7RIxNtI/6jYFAoFHjx4AAsLC0h0pX9Oh6WmpsLV1RWxsbGwtLQs63CINI6v8bdLCIG0tDQ4OztDKi29NSyZmZnIztZMD6VM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c3Nx9uzZl7bp7e0NhUKB3377rcj9BT07eXl5yrIaNWpALpfj7t27heJwdXUFAHh5eeH06dMqbZ06deqV19e6dWvY2tpizpw5Re5/2fLp48ePo3Pnzvj4449Rp04dVK5cudAyZ4lEAn9/f0ydOhXnz5+HTCbDjh07lPvr1q2LL774AidOnECtWrWwceNGAPn3/OrVq4Wu09PTE1Jp/q9TExMTdOzYEd988w2OHDmCkydPIjo6+pXXSkSvxmSFSEf17t0btra26Ny5M44dO4aYmBgcOXIEI0aMwL179wAAI0eOxOzZs7Fz505cuXIFn3322SufkeLu7o6goCAMGDAAO3fuVLb5448/AgDc3NwgkUiwe/duJCYmIj09HRYWFhg7dixGjx6NtWvX4ubNmzh37hwWLVqEtWvXAgA++eQTXL9+HePGjcPVq1exceNGREREvPL6zMzMsGrVKuzZswedOnXCwYMHcfv2bfz5558YP348PvnkkyKPq1KlirLn5PLlyxg6dCji4+OV+//44w/MmjULf/75J+7evYvt27cjMTERXl5eiImJwRdffIGTJ0/izp072L9/P65fvw4vLy8AwJQpU/D9999j6tSp+Pvvv3H58mX88MMPmDRpEgAgIiIC3333HS5evIhbt25h/fr1MDExgZubW7G+p0T0EmU9aYaIVCfYqrP/4cOHom/fvsLW1lbI5XJRuXJlMXjwYJGSkiKEyJ9QO3LkSGFpaSnKlSsngoODRd++fV86wVYIIZ49eyZGjx4tnJychEwmE56enmL16tXK/dOmTROOjo5CIpGIoKAgIUT+pODw8HBRrVo1YWRkJOzs7ESbNm3Eb7/9pjzu559/Fp6enkIul4smTZqI1atXv3ZirBBCnDlzRnTt2lXY2dkJuVwuPD09xZAhQ8T169eFEIUn2CYnJ4vOnTsLc3NzYW9vLyZNmqRyzZcuXRJt2rRRtle1alWxaNEiIYQQcXFxIjAwUHntbm5uYsqUKSIvL08Zz759+0Tjxo2FiYmJsLS0FA0bNhQrVqwQQgixY8cO0ahRI2FpaSnMzMzEO++8Iw4ePPjK6yOi15MI8Yaz2IiIiIjeAg4DERERkVZjskJERERajckKERERaTUmK0RERKTVmKwQERGRVmOyQkRERFqNyQoRERFpNSYrREREpNWYrBAREZFWY7JCREREWo3JChEREWk1JitERESk1f4PATyfuBNUy7cAAAAASUVORK5CYII=",
                        "text/plain": [
                            "<Figure size 640x480 with 2 Axes>"
                        ]
                    },
                    "metadata": {},
                    "output_type": "display_data"
                }
            ],
            "source": [
                "true_labels = df[\"is_correct_ref_link\"].map(REFERENCE_LINK_CORRECTNESS_PROMPT_RAILS_MAP).tolist()\n",
                "\n",
                "print(classification_report(true_labels, ref_link_classifications, labels=rails))\n",
                "confusion_matrix = ConfusionMatrix(\n",
                "    actual_vector=true_labels,\n",
                "    predict_vector=ref_link_classifications,\n",
                "    classes=rails,\n",
                ")\n",
                "confusion_matrix.plot(\n",
                "    cmap=plt.colormaps[\"Blues\"],\n",
                "    number_label=True,\n",
                "    normalized=True,\n",
                ")"
            ]
        }
    ],
    "metadata": {
        "colab": {
            "provenance": []
        },
        "kernelspec": {
            "display_name": "Python 3 (ipykernel)",
            "language": "python",
            "name": "python3"
        },
        "language_info": {
            "codemirror_mode": {
                "name": "ipython",
                "version": 3
            },
            "file_extension": ".py",
            "mimetype": "text/x-python",
            "name": "python",
            "nbconvert_exporter": "python",
            "pygments_lexer": "ipython3",
            "version": "3.10.3"
        },
        "widgets": {
            "application/vnd.jupyter.widget-state+json": {
                "0185c73040664f3aaf0aa9879094285d": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HBoxModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HBoxModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HBoxView",
                        "box_style": "",
                        "children": [
                            "IPY_MODEL_10787ef7b5eb4755a4eddce23a176297",
                            "IPY_MODEL_205d77c24b1c4cc68f44456a6c26aded",
                            "IPY_MODEL_8b79190d70df401d99bbf5f76c791f04"
                        ],
                        "layout": "IPY_MODEL_6d7c95c558a246f8b09066ba03348c9c"
                    }
                },
                "0252fb16ec714eda8d23dea03a46e2c6": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "DescriptionStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "DescriptionStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "description_width": ""
                    }
                },
                "0c1d5a8a7f5a45c98fe9697c4f0f2313": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "10787ef7b5eb4755a4eddce23a176297": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HTMLModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HTMLModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HTMLView",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_3d44d6062e8f4e84b8ded75b39894c49",
                        "placeholder": "​",
                        "style": "IPY_MODEL_9059e4f943314e11a39366c0b10787e2",
                        "value": "100%"
                    }
                },
                "164802686edb473b926c5abf3a12683a": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "FloatProgressModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "FloatProgressModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "ProgressView",
                        "bar_style": "success",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_0c1d5a8a7f5a45c98fe9697c4f0f2313",
                        "max": 180,
                        "min": 0,
                        "orientation": "horizontal",
                        "style": "IPY_MODEL_244948dc2fe0425ab2f9115c95777c42",
                        "value": 180
                    }
                },
                "205d77c24b1c4cc68f44456a6c26aded": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "FloatProgressModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "FloatProgressModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "ProgressView",
                        "bar_style": "success",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_b2507e55781f435fa72500a64f17af83",
                        "max": 180,
                        "min": 0,
                        "orientation": "horizontal",
                        "style": "IPY_MODEL_f1b4f0130a31485eaa7199aba9052599",
                        "value": 180
                    }
                },
                "21e2b03968f849ceae7defad60b74258": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HTMLModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HTMLModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HTMLView",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_f52cded2f0064c85b0919a7f6270a8f0",
                        "placeholder": "​",
                        "style": "IPY_MODEL_eaa9646440884096961cc90b3040949d",
                        "value": "100%"
                    }
                },
                "244948dc2fe0425ab2f9115c95777c42": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "ProgressStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "ProgressStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "bar_color": null,
                        "description_width": ""
                    }
                },
                "3d44d6062e8f4e84b8ded75b39894c49": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "3fefb750d6904f8eaf85ad9776effaad": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "4f978fb80b284000bcdf924e75fce7d6": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HBoxModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HBoxModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HBoxView",
                        "box_style": "",
                        "children": [
                            "IPY_MODEL_6c463eee458a4f0f8ff7bab452294e6d",
                            "IPY_MODEL_8b01367da83c4df88a2844ed63837802",
                            "IPY_MODEL_d6dbae84218348bd86e3938636a67248"
                        ],
                        "layout": "IPY_MODEL_97971f310e504be78048d7516f684356"
                    }
                },
                "56b19d7b9f6e477f95f9f2a2dd45584c": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "6c463eee458a4f0f8ff7bab452294e6d": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HTMLModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HTMLModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HTMLView",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_ca1f8130c01440ac8b49e758c8392b0a",
                        "placeholder": "​",
                        "style": "IPY_MODEL_ddabbf7048124b5b971e2f2539b71b57",
                        "value": "  4%"
                    }
                },
                "6d7c95c558a246f8b09066ba03348c9c": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "6e7094c3c45d46e1a549f3e3d40bfdfc": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "ProgressStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "ProgressStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "bar_color": null,
                        "description_width": ""
                    }
                },
                "8b01367da83c4df88a2844ed63837802": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "FloatProgressModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "FloatProgressModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "ProgressView",
                        "bar_style": "",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_56b19d7b9f6e477f95f9f2a2dd45584c",
                        "max": 180,
                        "min": 0,
                        "orientation": "horizontal",
                        "style": "IPY_MODEL_6e7094c3c45d46e1a549f3e3d40bfdfc",
                        "value": 7
                    }
                },
                "8b79190d70df401d99bbf5f76c791f04": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HTMLModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HTMLModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HTMLView",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_a64e823f48d048c4a25e001e974f11e8",
                        "placeholder": "​",
                        "style": "IPY_MODEL_0252fb16ec714eda8d23dea03a46e2c6",
                        "value": " 180/180 [02:07&lt;00:00,  1.33it/s]"
                    }
                },
                "9004be51b5324bbaa4ead60867963dd7": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "DescriptionStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "DescriptionStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "description_width": ""
                    }
                },
                "9059e4f943314e11a39366c0b10787e2": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "DescriptionStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "DescriptionStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "description_width": ""
                    }
                },
                "97971f310e504be78048d7516f684356": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "a64e823f48d048c4a25e001e974f11e8": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "b2507e55781f435fa72500a64f17af83": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "b45f43d172e44a9a97401ba7ecf1e203": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "bc1166807304402f880ea640c320e1ed": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HBoxModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HBoxModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HBoxView",
                        "box_style": "",
                        "children": [
                            "IPY_MODEL_21e2b03968f849ceae7defad60b74258",
                            "IPY_MODEL_164802686edb473b926c5abf3a12683a",
                            "IPY_MODEL_e376948cf55a4ab788df05e4af71e649"
                        ],
                        "layout": "IPY_MODEL_3fefb750d6904f8eaf85ad9776effaad"
                    }
                },
                "ca1f8130c01440ac8b49e758c8392b0a": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "cc7e5c7ce5944d668dcc4de558385096": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "DescriptionStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "DescriptionStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "description_width": ""
                    }
                },
                "d6dbae84218348bd86e3938636a67248": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HTMLModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HTMLModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HTMLView",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_d752abb65748466d9c073e77f975dbe1",
                        "placeholder": "​",
                        "style": "IPY_MODEL_cc7e5c7ce5944d668dcc4de558385096",
                        "value": " 7/180 [00:12&lt;04:53,  1.70s/it]"
                    }
                },
                "d752abb65748466d9c073e77f975dbe1": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                },
                "ddabbf7048124b5b971e2f2539b71b57": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "DescriptionStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "DescriptionStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "description_width": ""
                    }
                },
                "e376948cf55a4ab788df05e4af71e649": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "HTMLModel",
                    "state": {
                        "_dom_classes": [],
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "HTMLModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/controls",
                        "_view_module_version": "1.5.0",
                        "_view_name": "HTMLView",
                        "description": "",
                        "description_tooltip": null,
                        "layout": "IPY_MODEL_b45f43d172e44a9a97401ba7ecf1e203",
                        "placeholder": "​",
                        "style": "IPY_MODEL_9004be51b5324bbaa4ead60867963dd7",
                        "value": " 180/180 [02:15&lt;00:00,  1.28it/s]"
                    }
                },
                "eaa9646440884096961cc90b3040949d": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "DescriptionStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "DescriptionStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "description_width": ""
                    }
                },
                "f1b4f0130a31485eaa7199aba9052599": {
                    "model_module": "@jupyter-widgets/controls",
                    "model_module_version": "1.5.0",
                    "model_name": "ProgressStyleModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/controls",
                        "_model_module_version": "1.5.0",
                        "_model_name": "ProgressStyleModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "StyleView",
                        "bar_color": null,
                        "description_width": ""
                    }
                },
                "f52cded2f0064c85b0919a7f6270a8f0": {
                    "model_module": "@jupyter-widgets/base",
                    "model_module_version": "1.2.0",
                    "model_name": "LayoutModel",
                    "state": {
                        "_model_module": "@jupyter-widgets/base",
                        "_model_module_version": "1.2.0",
                        "_model_name": "LayoutModel",
                        "_view_count": null,
                        "_view_module": "@jupyter-widgets/base",
                        "_view_module_version": "1.2.0",
                        "_view_name": "LayoutView",
                        "align_content": null,
                        "align_items": null,
                        "align_self": null,
                        "border": null,
                        "bottom": null,
                        "display": null,
                        "flex": null,
                        "flex_flow": null,
                        "grid_area": null,
                        "grid_auto_columns": null,
                        "grid_auto_flow": null,
                        "grid_auto_rows": null,
                        "grid_column": null,
                        "grid_gap": null,
                        "grid_row": null,
                        "grid_template_areas": null,
                        "grid_template_columns": null,
                        "grid_template_rows": null,
                        "height": null,
                        "justify_content": null,
                        "justify_items": null,
                        "left": null,
                        "margin": null,
                        "max_height": null,
                        "max_width": null,
                        "min_height": null,
                        "min_width": null,
                        "object_fit": null,
                        "object_position": null,
                        "order": null,
                        "overflow": null,
                        "overflow_x": null,
                        "overflow_y": null,
                        "padding": null,
                        "right": null,
                        "top": null,
                        "visibility": null,
                        "width": null
                    }
                }
            }
        }
    },
    "nbformat": 4,
    "nbformat_minor": 0
}
